// Copyright 2017-2025 @polkadot/apps-config authors & contributors
// SPDX-License-Identifier: Apache-2.0

import type { TFunction } from '../types.js';
import type { EndpointOption, LinkOption } from './types.js';

export const CUSTOM_ENDPOINT_KEY = 'polkadot-app-custom-endpoints';

interface EnvWindow {
  // eslint-disable-next-line camelcase
  process_env?: {
    WS_URL: string;
  }
}

function findUiForUrl (url: string, endpoints: EndpointOption[]): LinkOption['ui'] {
  // Search through all endpoints to find a matching provider URL
  for (const endpoint of endpoints) {
    if (endpoint.providers) {
      for (const providerUrl of Object.values(endpoint.providers)) {
        if (providerUrl === url) {
          return endpoint.ui;
        }
      }
    }

    // Also check linked endpoints (parachains)
    if (endpoint.linked) {
      const linkedUi = findUiForUrl(url, endpoint.linked);

      if (linkedUi && (linkedUi.color || linkedUi.logo || linkedUi.identityIcon)) {
        return linkedUi;
      }
    }
  }

  return {};
}

export function createCustom (t: TFunction, endpoints: EndpointOption[] = []): LinkOption[] {
  const WS_URL = (
    (typeof process !== 'undefined' ? process.env?.WS_URL : undefined) ||
    (typeof window !== 'undefined' ? (window as EnvWindow).process_env?.WS_URL : undefined)
  );

  if (!WS_URL) {
    return [];
  }

  // Try to find UI configuration from existing endpoint with matching URL
  const ui = findUiForUrl(WS_URL, endpoints);

  return [
    {
      isHeader: true,
      text: t('rpc.dev.custom', 'Custom environment', { ns: 'apps-config' }),
      textBy: '',
      ui: {},
      value: ''
    },
    {
      info: 'WS_URL',
      text: t('rpc.dev.custom.entry', 'Custom {{WS_URL}}', { ns: 'apps-config', replace: { WS_URL } }),
      textBy: WS_URL,
      ui,
      value: WS_URL
    }
  ];
}

export function createOwn (t: TFunction): LinkOption[] {
  try {
    // this may not be available, e.g. when running via script
    const storedItems = typeof localStorage === 'object' && typeof localStorage.getItem === 'function'
      ? localStorage.getItem(CUSTOM_ENDPOINT_KEY)
      : null;

    if (storedItems) {
      const items = JSON.parse(storedItems) as string[];

      return items.map((textBy) => ({
        info: 'local',
        text: t('rpc.dev.custom.own', 'Custom', { ns: 'apps-config' }),
        textBy,
        ui: {},
        value: textBy
      }));
    }
  } catch (e) {
    console.error(e);
  }

  return [];
}

export function createDev (t: TFunction): LinkOption[] {
  return [
    {
      dnslink: 'local',
      info: 'local',
      text: t('rpc.dev.local', 'Local Node', { ns: 'apps-config' }),
      textBy: '127.0.0.1:9944',
      ui: {},
      value: 'ws://127.0.0.1:9944'
    }
  ];
}
